/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
/*
// 前后双指针循环
    ListNode* reverseList(ListNode* head) {
        if(head == nullptr || head->next == nullptr)
            return head;     
        ListNode* cur = head;
        ListNode* prev = nullptr, *nextcur;
        while(cur != nullptr){
            nextcur = cur->next;  // 保存 cur 的下一个节点
            cur->next = prev;  // 反转
            prev = cur;   // 更新
            cur = nextcur;
        }
        head = prev;  // 此时cur为空， prev为原链表最后一个节点，翻转后的头节点
        return head;
    }
*/

/*
//递归（从前往后反转，同上循环）
    ListNode* reverseList(ListNode* prev, ListNode* cur){
        if(cur == nullptr)
            return prev;
        // 反转
        ListNode* nextcur = cur->next;
        cur->next = prev;
        // 更新（等价于循环中 1. prev = cur;  2. cur = nextcur;）
        return reverseList(cur, nextcur);
    }
    ListNode* reverseList(ListNode* head) {
        // ListNode* cur = head, * prev = nullptr
        return reverseList(nullptr, head);  
    }
*/

// 递归（从后往前）
     /*
    第一轮出栈，head为5，head.next为空，返回5
    第二轮出栈，head为4，head.next为5，执行head.next.next=head也就是5.next=4，
            把当前节点的子节点的子节点指向当前节点
            此时链表为1->2->3->4<->5，由于4与5互相指向，所以此处要断开4.next=null
            此时链表为1->2->3->4<-5
            返回节点5
    第三轮出栈，head为3，head.next为4，执行head.next.next=head也就是4.next=3，
            此时链表为1->2->3<->4<-5，由于3与4互相指向，所以此处要断开3.next=null
            此时链表为1->2->3<-4<-5
            返回节点5
    第四轮出栈，head为2，head.next为3，执行head.next.next=head也就是3.next=2，
            此时链表为1->2<->3<-4<-5，由于2与3互相指向，所以此处要断开2.next=null
            此时链表为1->2<-3<-4<-5
            返回节点5
    第五轮出栈，head为1，head.next为2，执行head.next.next=head也就是2.next=1，
            此时链表为1<->2<-3<-4<-5，由于1与2互相指向，所以此处要断开1.next=null
            此时链表为1<-2<-3<-4<-5
            返回节点5
        出栈完成，最终头节点5->4->3->2->1
    */
    ListNode* reverseList(ListNode* head) {
        if(head == nullptr || head->next == nullptr)
            return head;
        ListNode* newhead = reverseList(head->next);  // 找到原链表最后一个节点
        head->next->next = head;  // 反转
        head->next = nullptr;   // 断开
        
        return newhead;
    }
};